#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define SER_PORT 5003
#define IP_ADDR "0.0.0.0" // Bind to all interfaces

int main(int argc, const char *argv[])
{
    struct sockaddr_in addr, cliAddr;
    socklen_t cliAddr_size = sizeof(cliAddr);
    int sockfd, retfd, ret;
    char buf[100];
    char response[100];

    // 第一步：创建socket套接字描述符
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1)
    {
        perror("socket创建失败");
        return -1;
    }

    // 第二步：绑定地址和端口号
    memset(&addr, 0, sizeof(addr)); // Initialize addr
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SER_PORT);
    addr.sin_addr.s_addr = INADDR_ANY; // Bind to all interfaces

    if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
    {
        perror("bind绑定失败");
        close(sockfd);
        return -1;
    }

    // 第三步：监听
    if (listen(sockfd, 5) != 0)
    {
        perror("listen监听失败");
        close(sockfd);
        return -1;
    }

    printf("正在等待来自客户端的请求\n");

    // 第四步：接受连接
    retfd = accept(sockfd, (struct sockaddr *)&cliAddr, &cliAddr_size);
    if (retfd == -1)
    {
        perror("accept失败");
        close(sockfd);
        return -1;
    }

    printf("等到了一个客户端请求\n");

    while (1)
    {
        // 接收来自客户端的信息
        memset(buf, 0, sizeof(buf));
        ssize_t n = recv(retfd, buf, sizeof(buf) - 1, 0);
        if (n < 0)
        {
            perror("recv失败");
            break;
        }
        else if (n == 0) // Connection closed by client
        {
            printf("客户端关闭了连接\n");
            break;
        }
        buf[n] = '\0'; // Null-terminate the string

        printf("接收到客户端信息：%s\n", buf);

        // 从控制台获取要回传给客户端的消息
        printf("请输入要回传给客户端的消息（输入 'exit' 退出）：");
        fgets(response, sizeof(response), stdin);
        response[strcspn(response, "\n")] = 0; // Remove newline character

        if (strcmp(response, "exit") == 0)
        {
            printf("退出服务器\n");
            break;
        }

        // 向客户端回传信息
        send(retfd, response, strlen(response), 0);
    }

    // 关闭套接字
    close(retfd);
    close(sockfd);

    return 0;
}